home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / machserver / tests / suicide / suicide.c < prev   
Encoding:
C/C++ Source or Header  |  1992-03-13  |  2.7 KB  |  121 lines

  1. /* 
  2.  * suicide.c --
  3.  *
  4.  *    Test program that sends a signal to itself.  The point of this 
  5.  *    program is (1) to ensure that the signal recipient is doing a 
  6.  *    Sprite request when the signal is posted and (2) to see what 
  7.  *    happens after the signal is processed.
  8.  *
  9.  * Copyright 1991 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that this copyright
  13.  * notice appears in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #ifndef lint
  20. static char rcsid[] = "$Header: /user5/kupfer/spriteserver/tests/suicide/RCS/suicide.c,v 1.1 92/03/12 20:55:32 kupfer Exp $ SPRITE (Berkeley)";
  21. #endif /* not lint */
  22.  
  23. #include <signal.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26.  
  27. int sigNum = SIGTERM;        /* which signal to send */
  28.  
  29. /* 
  30.  * Additional options.
  31.  */
  32. #define NO_TRICKS    0    /* just send the signal */
  33. #define USE_SIGSETMASK    1    /* block the signal with sigsetmask */
  34. #define USE_SIGBLOCK    2    /* block the signal with sigblock */
  35. #define CATCH_SIGNAL    3    /* catch the signal */
  36. int option = NO_TRICKS;
  37.  
  38. void Handler();
  39.  
  40.  
  41. /*
  42.  *----------------------------------------------------------------------
  43.  *
  44.  * main --
  45.  *
  46.  *    Send the signal and then print something afterwards.
  47.  *
  48.  * Results:
  49.  *    None.
  50.  *
  51.  * Side effects:
  52.  *    None.
  53.  *
  54.  *----------------------------------------------------------------------
  55.  */
  56.  
  57. int
  58. main(argc, argv)
  59.     int argc;
  60.     char *argv[];
  61. {
  62.     int argCh;
  63.     extern int optind;
  64.     int sigMask;
  65.     char *usage = "Usage: suicide [-b|-m|-h] [sigNum]\n";
  66.  
  67.     while ((argCh = getopt(argc, argv, "bmh")) != EOF) {
  68.     switch (argCh) {
  69.     case 'b':
  70.         option = USE_SIGBLOCK;
  71.         break;
  72.     case 'm':
  73.         option = USE_SIGSETMASK;
  74.         break;
  75.     case 'h':
  76.         option = CATCH_SIGNAL;
  77.         break;
  78.     default:
  79.         fprintf(stderr, usage);
  80.         exit(1);
  81.         break;
  82.     }
  83.     }
  84.     if (optind < argc) {
  85.     sigNum = atoi(argv[optind]);
  86.     }
  87.     if (sigNum <= 0  || sigNum >= NSIG) {
  88.     fprintf(stderr, "%d isn't a valid signal number.\n", sigNum);
  89.     exit(1);
  90.     }
  91.  
  92.     sigMask = sigmask(sigNum);
  93.     switch (option) {
  94.     case USE_SIGBLOCK:
  95.     printf("sigblock(0x%x) => 0x%x\n", sigMask, sigblock(sigMask));
  96.     break;
  97.     case USE_SIGSETMASK:
  98.     printf("sigsetmask(0x%x) => 0x%x\n", sigMask, sigsetmask(sigMask));
  99.     break;
  100.     case CATCH_SIGNAL:
  101.     if (signal(sigNum, Handler) == BADSIG) {
  102.         perror("can't register handler");
  103.         exit(1);
  104.     }
  105.     }
  106.  
  107.     if (kill(getpid(), sigNum) < 0) {
  108.     perror("kill");
  109.     exit(1);
  110.     }
  111.  
  112.     printf("My process id is %x.\n", getpid());
  113.     exit(0);
  114. }
  115.  
  116. void
  117. Handler()
  118. {
  119.     printf("got signal\n");
  120. }
  121.